/**
 * 2010(c) Copyright Oceansoft Information System Co.,LTD. All rights reserved.
 * <p>
 * Compile: JDK 1.6+
 * <p>
 * 版权所有(C)：江苏欧索软件有限公司
 * <p>
 * 公司名称：江苏欧索软件有限公司
 * <p>
 * 公司地址：中国苏州科技城青山路1号
 * <p>
 * 网址: http://www.oceansoft.com.cn
 * <p>
 * 作者: 090922(陈伟)
 * <p>
 * 文件名: com.oceansoft.mobile.econsole.modules.file.service.impl.SysFileServiceImpl.java
 * <p>
 * 类产生时间: 2014-5-29 0029 上午 9:50
 * <p>
 * 负责人: 090922(陈伟)
 * <p>
 * Email:javacspring@gmail.com
 * <p>
 * 所在组 : 掌上公安应用平台
 * <p>
 * 所在部门: 开发部--手持技术部
 * <p>
 * <p>
 */
package com.oceansoft.mobile.econsole.modules.file.service.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.oceansoft.mobile.econsole.common.constant.ConfigInfo;
import com.oceansoft.mobile.econsole.common.util.web.PageUtil;
import com.oceansoft.mobile.econsole.modules.api.entity.SysFile;
import com.oceansoft.mobile.econsole.modules.api.persistence.ISysFileMapper;
import com.oceansoft.mobile.econsole.modules.base.entity.Pager;
import com.oceansoft.mobile.econsole.modules.base.entity.Query;
import com.oceansoft.mobile.econsole.modules.base.entity.Result;
import com.oceansoft.mobile.econsole.modules.file.service.ISysFileService;
import org.apache.commons.io.FileUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;

/**
 * 系统文件管理业务组件实现类
 *
 * @author: chenw
 * @time: 2014-5-29 0029 上午 9:50
 */
@Service
public class SysFileServiceImpl implements ISysFileService {
    @Resource
    protected ConfigInfo configInfo;

    @Resource
    private ISysFileMapper sysFileMapper;

    @Override
    @Transactional(readOnly = false, rollbackFor = Exception.class)
    public Result saveFile(String hostIP, String userId, String fileId, String catalog, MultipartFile file) {
        String _extName = com.oceansoft.mobile.econsole.common.util.FileUtils.getExtName(file.getOriginalFilename());
        String _relPath = catalog + "/" + (fileId + _extName);//存储相对路径
        try {
            FileUtils.writeByteArrayToFile(new File(String.format("%s/%s", configInfo.getUploadSubDir(catalog), String.format("%s%s", fileId, _extName))), file.getBytes());
        } catch (IOException e) {
            e.printStackTrace();
        }
        SysFile sysFile = new SysFile();
        sysFile.setFileId(fileId);
        sysFile.setMd5(fileId);
        sysFile.setUserId(userId);
        sysFile.setName(file.getOriginalFilename());
        sysFile.setUploadTime(new Date());
        sysFile.setFileType(file.getContentType());
        sysFile.setPath(_relPath);
        sysFile.setUrl(configInfo.getFileDownloadUrl(_relPath));
        sysFile.setSize(file.getSize());
        sysFile.setCatalog(catalog);
       /* try {
            sysFile.setMd5(DigestUtils.md5DigestAsHex(file.getBytes()));
        } catch (IOException e) {
            e.printStackTrace();
        }*/
        return new Result(Result.SUCC, sysFile);
    }

    @Override
    public Pager<SysFile> findByCondition(Query query) {
        PageHelper.startPage(query.getPageNum(), query.getNumPerPage(), true);
        Page<SysFile> page = (Page<SysFile>) sysFileMapper.findPageByCondition(query);
        return PageUtil.page2pager(page, query);
    }

    @Override
    @Transactional
    public Result delete(int id) {
        //删除记录
        SysFile file = sysFileMapper.findById(id);
        sysFileMapper.delete(id);
        try {
            //删除文件
            FileUtils.forceDelete(new File(file.getPath()));
            return new Result("文件删除成功！");
        } catch (IOException ex) {
            //删除文件失败，则回滚当前数据库记录
            throw new RuntimeException(String.format("Delete file %s failure,rollback database record!", file.getName()), ex);
        }
    }

    @Override
    public SysFile findById(int fileId) {
        return sysFileMapper.findById(fileId);
    }

    @Override
    @Transactional
    public Result deleteByFileId(String fileId) {
        SysFile file = sysFileMapper.findByFileId(fileId);
        if (null != file) {
            sysFileMapper.delete(file.getId());
            try {
                //删除文件
                FileUtils.forceDelete(new File(String.format("%s/%s", configInfo.getFileUploadRootPath(), file.getPath())));
                return new Result("文件删除成功！");
            } catch (IOException ex) {
                //删除文件失败，则回滚当前数据库记录
                throw new RuntimeException(String.format("Delete file %s failure,rollback database record!", file.getName()), ex);
            }
        } else {
            return new Result(Result.FAILURE, "文件不存在");
        }
    }

    @Override
    public Result saveAppFileBatch(String userId, String catalog, List<MultipartFile> mps) {
        //检验上传文件是否存在
        if (mps.size() == 0)
            return new Result(Result.FAILURE, "请选择上传文件");
        //创建或检测当前用户文件夹是否存在
        String dirPath = String.format("%s/%s", configInfo.getFileUploadRootPath(), catalog);
        String realPath = String.format("%s", catalog);//相对位置
        File userDir = new File(dirPath);
        if (!userDir.exists()) {
            try {
                FileUtils.forceMkdir(userDir);
            } catch (IOException e) {
                e.printStackTrace();
                return new Result(Result.FAILURE, "创建目录失败");
            }
        }
        //生成新的文件名称并存储数据库记录
        ArrayList<SysFile> fs = new ArrayList<SysFile>(mps.size());
        for (MultipartFile mp : mps) {
            String suffix = mp.getOriginalFilename().substring(mp.getOriginalFilename().lastIndexOf(".") + 1);
            //原文件名称_上传日期
            String fileId = UUID.randomUUID().toString().replaceAll("-", "");
            String randName = String.format("%s.%s", fileId, suffix);
            try {
                SysFile sysFile = new SysFile();
                sysFile.setFileId(fileId);
                sysFile.setUserId(userId);
                sysFile.setName(mp.getOriginalFilename());
                sysFile.setUploadTime(new Date());
                sysFile.setFileType(mp.getContentType());
                sysFile.setPath(String.format("%s/%s", realPath, randName));
                sysFile.setUrl(configInfo.getFileDownloadUrl(realPath + "/" + randName));
                sysFile.setSize(mp.getSize());
                sysFile.setCatalog(catalog);
                sysFile.setThumbnail("");
                sysFile.setRemark("");
                FileUtils.writeByteArrayToFile(new File(String.format("%s/%s", dirPath, randName)), mp.getBytes());
                fs.add(sysFile);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        try {
            sysFileMapper.saveFileBatch(fs);
            return new Result(Result.SUCC, fs);
        } catch (Exception ex) {
            //删除步骤一中存储的文件
            for (SysFile f : fs) {
                try {
                    FileUtils.forceDelete(new File(f.getPath()));
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            //抛出异常,回滚数据库记录
            throw new RuntimeException("data insert failure,delete upload file succ!", ex);
        }
    }
}
